# author:wuqij
# datetime:2019/11/23 15:51
# software: PyCharm
import json
import datetime

from flask_restful import fields




def check_type_date(value):
    if value:
        try:
            value = datetime.datetime.strptime(value, "%Y-%m-%d").date()
        except Exception as e:
            error = ("时间类型：{} 格式错误!".format(value))
            raise ValueError(error)
    return value


def check_start_date(value):
    """
        检验开始日期/时间字符串
        example： '2021-10-01' --> '2021-10-01 00:00:00'
    :param value:
    :return:
    """
    if value:
        try:
            datetime.datetime.strptime(value, "%Y-%m-%d")
        except Exception as e:
            error = ("时间类型：{} 格式错误!".format(value))
            raise ValueError(error)
        value += ' 00:00:00'
    return value


def check_end_date(value):
    """
        检验截止日期/时间字符串
        场景是：前端给用户界面操作的是日期组件。而后端需要用timestamp字符串去查询过滤
        example： '2021-10-01' --> '2021-10-01 23:59:59'
    :param value:
    :return:
    """
    if value:
        try:
            datetime.datetime.strptime(value, "%Y-%m-%d")
        except Exception as e:
            error = ("时间类型：{} 格式错误!".format(value))
            raise ValueError(error)
        value += ' 23:59:59'
    return value


def check_date(value):
    """
    校验参数是不是符合时间类型的字符串并把参数转换成时间类型
    :param value:
    :return:
    """
    if value:
        try:
            value = datetime.datetime.strptime(value, "%Y-%m-%d")
        except Exception as e:
            error = ("时间类型：{} 格式错误!".format(value))
            raise ValueError(error)
    return value


def check_int(value):
    """
    校验参数是不是符合int类型的字符串并把参数转换成int类型
    :param value:
    :return:
    """
    if value:
        try:
            value = int(value)
        except Exception as e:
            error = ("int类型：{} 格式错误!".format(value))
            raise ValueError(error)
    return value


def check_float(value):
    """
    校验参数是不是符合float类型的字符串并把参数转换成float类型
    :param value:
    :return:
    """
    if value:
        try:
            value = float(value)
        except Exception as e:
            error = ("float类型：{} 格式错误!".format(value))
            raise ValueError(error)
    return value


def check_json(value):
    if value:
        try:
            value = json.loads(value)
        except Exception as e:
            error = ("json类型：{} 格式错误！".find(value))
            raise ValueError(error)
    return value


def check_positive(value):
    """
    校验参数是不是符合正整数格式并把参数转换成int类型
    :param value:
    :return:
    """
    if value:
        error = ("int类型：{} 格式错误!".format(value))
        try:
            value = int(value)
        except Exception as e:
            raise ValueError(error)
        if value == 0:
            raise ValueError(error)
    return value


def check_bool(value):
    """
    将字符串False和True转换成bool类型
    :param value:
    :return:
    """
    if value:
        if value == 'false':
            value = False
        if value == 'true':
            value = True
        if value not in (True, False):
            error = ("bool类型：{} 格式错误!".format(value))
            raise ValueError(error)

    return value


def check_section(valeu, start, end, name):
    '''
    校验区间
    :param valeu:
    :param start:
    :param end:
    :return:
    '''




def check_parameter_int(value, is_must=False):
    """
    校验参数是不是int类型
    :param value:
    :param is_must:是否必须
    :return:
    """




def check_datetime(value, format="%Y-%m-%d %H:%M:%S"):
    """
        校验参数是不是符合时间类型的字符串并把参数转换成时间类型
    """
    try:
        value = datetime.datetime.strptime(value, format)
    except Exception as e:
        raise ValueError('{} 时间格式有误'.format(value))
    return value


def check_date_hour(value, format="%Y-%m-%d %H"):
    """
        校验参数是不是符合年月日 时的字符串并把参数转换成时间类型
    """
    try:
        value = datetime.datetime.strptime(value, format)
    except Exception as e:
        raise ValueError('{} 时间格式有误'.format(value))

    return value


def check_date_m(value, format="%Y-%m-%d %H:%M"):
    """
        校验参数是不是符合年月日 时分的字符串并把参数转换成时间类型
    """
    try:
        value = datetime.datetime.strptime(value, format)
    except Exception as e:
        raise ValueError('{} 时间格式有误'.format(value))

    return value


def max_length(max_length):
    """
        检测字符串长度
    """

    def validate(s):
        if len(s) <= max_length:
            return s
        raise ValueError(f"字符串最长{max_length}个字符")

    return validate


def split_convert_int(value):
    """
        分离字符串并转换为int
    """
    return [int(val) for val in value.split(",")]





def positive_int(num):
    """
    正整数
    :param num:
    :return:
    """
    if not (isinstance(num, int) and num >= 0):
        raise ValueError('{} is not a positive integer.'.format(num))
    return num


def check_mul_id(args):
    """
    将形如"81,21"的数据转化为[81, 21]
    :param args:
    :return:
    """
    if not args:
        return []
    if not isinstance(args, str):
        raise ValueError('{} is not a string.'.format(args))
    # 分割、去重
    temp = []
    for x in args.split(","):
        if not x.isdigit():
            raise ValueError('{} is not a positive integer.'.format(x))
        temp.append(int(x))
    return temp
